/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.graficaluna.service.pedido;

import com.graficaluna.dao.pedido.OrdenTrabajoDAO;
import com.graficaluna.dao.pedido.PedidoDAO;
//import dto.DetalleOrdenTrabajoDTO;
import dto.OrdenTrabajoDTO;
import dto.PedidoDTO;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.sql.Connection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.jasperreports.engine.JasperRunManager;
import util.Util;

/**
 *
 * @author ralf
 */
public class ServicioOrdenTrabajo {
    
    public List<OrdenTrabajoDTO> listarOrdenesTrabajo() {
        try {
            OrdenTrabajoDAO dao = new OrdenTrabajoDAO();
            List<OrdenTrabajoDTO> ordenes = dao.listarOrdenesTrabajo();
            return ordenes;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    public void priorizarOrdenes() {
        OrdenTrabajoDAO dao = new OrdenTrabajoDAO();
        dao.priorizarOrdenes();
    }
    
    public void actualizarOrdenMaquinas(List<OrdenTrabajoDTO> lista) {
        OrdenTrabajoDAO dao = new OrdenTrabajoDAO();
        for (OrdenTrabajoDTO orden : lista) {
            dao.actualizarOrdenMaquina(orden);
        }
    }
    
    public byte[] verReporte(File archivo) {
        try {
            OrdenTrabajoDAO dao = new OrdenTrabajoDAO();
            Connection con = dao.obtenerConnexion();
            Map map = new HashMap();
            byte[] bytesArchivo = Util.getBytesFromFile(archivo);
            byte[] bytes = JasperRunManager.runReportToPdf(new ByteArrayInputStream(bytesArchivo), map, con);
            con.close();
            return bytes;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
        }
    }
    
    public void grabar(OrdenTrabajoDTO orden) throws Exception {
        try {
            Long codigoAnterior = null;
            if (orden.getCodigo() != null) {
                codigoAnterior = orden.getCodigo();
                eliminarOrdenTrabajo(orden);
            }
            OrdenTrabajoDAO dao = new OrdenTrabajoDAO();
            dao.insertar(orden);
            for (PedidoDTO pe : orden.getLstPedidos()) {
                pe.setEstado("PA");
                new ServicioPedido().actualizarEstado(pe);
            }
            if (codigoAnterior != null) {
                orden.setCodigoCliente(codigoAnterior); // almacena temporalmente el codigo anterior en el codigo cliente 
                cambiarCodigoOrdenTrabajo(orden);
                orden.setCodigo(codigoAnterior);
            }
        } catch (Exception ex) {
            throw new Exception(ex.getMessage());
        }
    }
    
    public OrdenTrabajoDTO obtenerOrdenTrabajo(OrdenTrabajoDTO orden) throws Exception {
        OrdenTrabajoDAO dao = new OrdenTrabajoDAO();
        orden = dao.obtenerOrdenTrabajo(orden);
        return orden;
    }
    
    private void eliminarOrdenTrabajo(OrdenTrabajoDTO orden) throws Exception {
        OrdenTrabajoDAO dao = new OrdenTrabajoDAO();
        dao.eliminarOrdenTrabajo(orden);
    }
    
    private void cambiarCodigoOrdenTrabajo(OrdenTrabajoDTO orden) throws Exception {
        OrdenTrabajoDAO dao = new OrdenTrabajoDAO();
        dao.cambiarCodigoOrdenTrabajo(orden);
    }

    public void anularOrdenTrabajo(OrdenTrabajoDTO orden) throws Exception {
        OrdenTrabajoDAO dao = new OrdenTrabajoDAO();
        dao.anularOrdenTrabajo(orden);
        PedidoDAO pd = new PedidoDAO();
        for (PedidoDTO p : orden.getLstPedidos()) {
            p.setEstado("P");
            pd.actualizarEstado(p);
        }
    }
    
     public void actualizarAsignacionMaquina(OrdenTrabajoDTO orden) throws Exception {
        OrdenTrabajoDAO dao = new OrdenTrabajoDAO();
        dao.actualizarAsignacionMaquina(orden);
    }
}
